package dtofactory;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;

import sessionbeans.AdminArticulosBean;


import entities.*;
import entitiesdto.*;


public class FactoryDTO {
	
	
    private static FactoryDTO instance;

    private FactoryDTO(){

    }

    public static FactoryDTO getInstance(){
            if(instance==null)
                    instance = new FactoryDTO();
            return instance;
    }

    
    // Articulo

    public ArticuloDTO artToDto(Articulo articulo){
            ArticuloDTO dto = null;
            if (articulo instanceof Hogar){
                    Hogar art = (Hogar) articulo;
                    HogarDTO aux = new HogarDTO();
                    aux.setColor(art.getColor());
                    aux.setDescripcion(art.getDescripcion());
                    aux.setLinea(art.getLinea());
                    aux.setPrecio(art.getPrecio());
                    aux.setRef(art.getRef());
                    aux.setSeccion(art.getSeccion());
                    aux.setTiempoFabricacion(art.getTiempoFabricacion());
                    //especificos
                    aux.setNombre(art.getNombre());
                    aux.setCategoria(art.getCategoria());
                    aux.setMedidas(art.getMedidas());
                    aux.setComposicion(art.getComposicion());

                    ArrayList<CantidadMateriaPrimaDTO> result = new ArrayList<CantidadMateriaPrimaDTO>();
                    for(CantidadMateriaPrima c : art.getCantidadMateriasPrimas()){
                            CantidadMateriaPrimaDTO cmp = cmpToDto(c);
                            result.add(cmp);
                    }
                    aux.setCantidadMateriasPrimas(result);
                    dto = aux;
                    
            } else if (articulo instanceof Ropa){
                    Ropa art = (Ropa) articulo;
                    RopaDTO aux = new RopaDTO();
                    aux.setColor(art.getColor());
                    aux.setDescripcion(art.getDescripcion());
                    aux.setLinea(art.getLinea());
                    aux.setPrecio(art.getPrecio());
                    aux.setRef(art.getRef());
                    aux.setSeccion(art.getSeccion());
                    aux.setTiempoFabricacion(art.getTiempoFabricacion());
                    //especificos
                    aux.setTalle(art.getTalle());
                    aux.setOrigen(art.getOrigen());

                    ArrayList<CantidadMateriaPrimaDTO> result = new ArrayList<CantidadMateriaPrimaDTO>();
                    for(CantidadMateriaPrima c : art.getCantidadMateriasPrimas()){
                            CantidadMateriaPrimaDTO cmp = cmpToDto(c);
                            result.add(cmp);
                    }
                    aux.setCantidadMateriasPrimas(result);
                    dto = aux;
            }

            return dto;
    }

    public Articulo dtoToArt(ArticuloDTO articulo){
            Articulo respuesta = null;
            if (articulo instanceof HogarDTO){
                    HogarDTO art = (HogarDTO) articulo;
                    Hogar aux = new Hogar();
                    aux.setColor(art.getColor());
                    aux.setDescripcion(art.getDescripcion());
                    aux.setLinea(art.getLinea());
                    aux.setPrecio(art.getPrecio());
                    aux.setRef(art.getRef());
                    aux.setSeccion(art.getSeccion());
                    aux.setTiempoFabricacion(art.getTiempoFabricacion());
                    //especificos
                    aux.setNombre(art.getNombre());
                    aux.setCategoria(art.getCategoria());
                    aux.setMedidas(art.getMedidas());
                    aux.setComposicion(art.getComposicion());

                    ArrayList<CantidadMateriaPrima> result = new ArrayList<CantidadMateriaPrima>();
                    for(CantidadMateriaPrimaDTO c : art.getCantidadMateriasPrimas()){
                            CantidadMateriaPrima cmp = dtoToCmp(c);
                            result.add(cmp);
                    }
                    aux.setCantidadMateriasPrimas(result);
                    respuesta = aux;
                    
            } else if (articulo instanceof RopaDTO){
                    RopaDTO art = (RopaDTO) articulo;
                    Ropa aux = new Ropa();
                    aux.setColor(art.getColor());
                    aux.setDescripcion(art.getDescripcion());
                    aux.setLinea(art.getLinea());
                    aux.setPrecio(art.getPrecio());
                    aux.setRef(art.getRef());
                    aux.setSeccion(art.getSeccion());
                    aux.setTiempoFabricacion(art.getTiempoFabricacion());
                    //especificos
                    aux.setTalle(art.getTalle());
                    aux.setOrigen(art.getOrigen());

                    List<CantidadMateriaPrima> result = new ArrayList<CantidadMateriaPrima>();
                    for(CantidadMateriaPrimaDTO c : art.getCantidadMateriasPrimas()){
                            CantidadMateriaPrima cmp = dtoToCmp(c);
                            result.add(cmp);
                    }
                    
                    aux.setCantidadMateriasPrimas(result);
                    respuesta = aux;
            }

            return respuesta;
    }

    // Pedido a proveedores
    
    public PedidoProveedoresDTO pedProovToDto (PedidoProveedores pedido){
    	PedidoProveedoresDTO pedidoProovDTO = new PedidoProveedoresDTO();
    	List<CantidadMateriaPrimaDTO> materiasDto = new ArrayList<CantidadMateriaPrimaDTO>();
    	for (CantidadMateriaPrima aux : pedido.getMateriaPrimaPedida()) {
    		materiasDto.add(this.cmpToDto(aux));
		}
    	pedidoProovDTO.setMateriaPrimaPedida(materiasDto);
    	return pedidoProovDTO;
    }
    
    // Cantidad Materia Prima

    public CantidadMateriaPrima dtoToCmp(CantidadMateriaPrimaDTO c){
            CantidadMateriaPrima aux = new CantidadMateriaPrima();
            aux.setCantidad(c.getCantidad());
            aux.setMateriaPrima(this.mpFromDTO(c.getMateriaPrima()));
            return aux;
    }
    
    public StockMateriaPrima dtoTosmp(StockMateriaPrimaDTO c){
    	StockMateriaPrima aux = new StockMateriaPrima();
        aux.setCantidad(c.getCantidad());
        aux.setMateriaPrima(this.mpFromDTO(c.getMateriaPrima()));
        return aux;
    }

    public MateriaPrima mpFromDTO(MateriaPrimaDTO mp){
            MateriaPrima materia = new MateriaPrima();
            materia.setDescripcion(mp.getDescripcion());
            materia.setRef(mp.getRef());
            materia.setUnidadMedida(mp.getUnidadMedida());
            return materia;
    }
    
    public CantidadMateriaPrimaDTO cmpToDto(CantidadMateriaPrima cmp){
            CantidadMateriaPrimaDTO aux = new CantidadMateriaPrimaDTO();
            aux.setCantidad(cmp.getCantidad());
            aux.setMateriaPrima(mpToDto(cmp.getMateriaPrima()));
            return aux;
    }

    //Materia Prima
    public MateriaPrimaDTO mpToDto(MateriaPrima mp){
            MateriaPrimaDTO aux = new MateriaPrimaDTO();
            aux.setRef(mp.getRef());
            aux.setUnidadMedida(mp.getUnidadMedida());
            aux.setDescripcion(mp.getDescripcion());
            return aux;
    }

    //Cantidad Articulo
    public CantidadArticuloDTO asolToDTO(CantidadArticulo as){
            CantidadArticuloDTO a = new CantidadArticuloDTO();
            a.setCantidadPedida(as.getCantidadPedida());
            a.setId(as.getId());
            a.setArticulo(this.artToDto(as.getArticulo()));
            return a;

    }
    
    public CentroDeDistribucionDTO centrotoDTO(CentroDeDistribucion c){
    	CentroDeDistribucionDTO centr = new CentroDeDistribucionDTO();
    	centr.setId(c.getId());
    	return centr;
    }
    
    public EnvioCentroDistribucionDTO envtoDTO (EnvioCentroDistribucion envio){
    	EnvioCentroDistribucionDTO env = new EnvioCentroDistribucionDTO();
    	env.setCd(this.centrotoDTO(envio.getCd()));
    	env.setId(envio.getId());
    	env.setIdSolFab(String.valueOf(envio.getSolFabr().getId()));
    	List<CantidadArticuloDTO> canti = new Vector<CantidadArticuloDTO>();
    	for(CantidadArticulo cant: envio.getArticulos()){
    		canti.add(this.asolToDTO(cant));
    	}
    	env.setArticulos(canti);
    	return env;
    }
    
    
    public SolicitudFabricacion solFromDTO(SolicitudFabricacionDTO sol){
            SolicitudFabricacion toreturn = new SolicitudFabricacion();
            toreturn.setFechaSolicitud(new Date());
            toreturn.setId(sol.getId());
            return toreturn;
    }

	public List<PedidoFabricacionDTO> pedFabToDTO(List <PedidoFabricacion> pedidos) {
		List<PedidoFabricacionDTO> pedidosdto = new ArrayList<PedidoFabricacionDTO>();
		for (PedidoFabricacion pedi : pedidos) {
			PedidoFabricacionDTO pedidto = this.pedFabToDTO(pedi);
			pedidosdto.add(pedidto);
		}
		return pedidosdto;
	}
	
	public PedidoFabricacionDTO pedFabToDTO(PedidoFabricacion pedido){
		PedidoFabricacionDTO pfdto = new PedidoFabricacionDTO();
		pfdto.setId(pedido.getId());
		pfdto.setCantidadFabricada(pedido.getCantidadFabricada());
		pfdto.setCantidadSolicitada(pedido.getCantidadSolicitada());
		pfdto.setArticulo(this.artToDto(pedido.getArticulo()));
		return pfdto;
	}
	
	

	
}
